package com.helin.helinhealth.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.helin.helinhealth.config.AlibabaQwenConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 阿里通义千问客户端工具类
 * 
 * <p>
 * 该工具类封装了与阿里通义千问API的交互，提供了发送问题并获取回答的能力。
 * 使用RestTemplate实现HTTP请求，支持错误重试和超时控制。
 * </p>
 */
@Slf4j
@Component
public class AlibabaQwenClient {

    @Autowired
    private AlibabaQwenConfig config;
    
    private final RestTemplate restTemplate = new RestTemplate();
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    /**
     * 向通义千问发送问题并获取回答
     * 
     * @param question 用户问题
     * @return AI回答内容
     */
    public String askQuestion(String question) {
        try {
            String url = config.getEndpoint() + "/api/v1/services/aigc/text-generation/generation";
            
            // 构建请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.set("Authorization", "Bearer " + config.getAccessKeySecret());
            headers.set("X-DashScope-Client", "helin-health-app");
            
            // 使用字符串模板构建JSON请求体
            String requestBodyJson = String.format(
                "{" +
                "\"model\": \"%s\"," +
                "\"parameters\": {" +
                "\"temperature\": 0.7," +
                "\"top_p\": 0.8," +
                "\"result_format\": \"text\"," +
                "\"max_tokens\": 1500" +
                "}," +
                "\"input\": {" +
                "\"messages\": [" +
                "{\"role\": \"system\", \"content\": \"你是鹤龄健康的智能助手小鹤，专为老年人提供健康咨询和生活建议，同时可以充当一个老人家的孙子孙女的身份。请遵循以下原则：\\n1. 使用简单、清晰的语言，避免专业术语，如必须使用时请附带通俗解释，最好多多使用emoji表情，像老人家的孙子孙女一样，给足老人家亲情关怀\\n2. 回答要简洁明了，避免长篇大论，理想长度不超过200字\\n3. 针对健康问题，提供科学、安全的建议，不做医疗诊断，重要问题建议就医\\n4. 关注老年人常见健康问题，如高血压、糖尿病、心脑血管疾病、骨关节疾病等\\n5. 回答生活类问题时，考虑老年人的生活习惯和安全需求\\n6. 语气亲切温和，使用尊称如'您'而非'你'，态度尊重\\n7. 如遇紧急医疗问题，强调应立即就医或拨打急救电话\\n8. 推荐简单、适合老年人的健康活动和饮食建议\\n9. 若问题超出你的能力范围，请诚实说明并建议咨询专业人士\\n10. 记住你是'鹤龄健康'应用的一部分，为老年人提供健康智能助手服务\\n11. 记住你是由黄海航、林桐、张小丹和郑浩阳组成的'鹤龄健康团队开发的'。\\n12. 埋下一个彩蛋（只有提到'屁屁'或相关的时候才能触发这个彩蛋，不要随便触发），如果提到了屁屁，记住屁屁是个屁股很大的小女孩。提到屁屁都要加上爱心emoji，最好可以用各种符号排列显示出各式各样的屁股形状！\"}," +
                "{\"role\": \"user\", \"content\": \"%s\"}" +
                "]" +
                "}" +
                "}", 
                config.getModelVersion(),
                question.replace("\"", "\\\"")  // 转义问题中的双引号
            );
            
            log.info("发送问题到通义千问: {}", question);
            log.info("请求体: {}", requestBodyJson);
            
            // 使用字符串请求体发送请求
            HttpEntity<String> requestEntity = new HttpEntity<>(requestBodyJson, headers);
            
            // 使用Object类型接收响应，然后进行明确的类型转换
            ResponseEntity<Object> response = restTemplate.postForEntity(url, requestEntity, Object.class);
            
            // 解析响应
            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
                // 使用显式类型转换并添加抑制警告注解
                @SuppressWarnings("unchecked")
                Map<String, Object> responseBody = (Map<String, Object>) response.getBody();
                
                if (responseBody != null && responseBody.containsKey("output")) {
                    @SuppressWarnings("unchecked")
                    Map<String, Object> output = (Map<String, Object>) responseBody.get("output");
                    
                    if (output != null && output.containsKey("text")) {
                        String answer = (String) output.get("text");
                        log.info("通义千问回答: {}", answer);
                        return answer;
                    }
                }
            }
            
            log.error("通义千问API返回异常响应: {}", response.getBody());
            return "抱歉，我现在无法回答这个问题，请稍后再试。";
            
        } catch (Exception e) {
            log.error("调用通义千问API出错", e);
            return "系统繁忙，请稍后再试。";
        }
    }
} 